package me.magicall.db.springjdbc;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import me.magicall.convenient.ResultView;
import me.magicall.db.model.BaseModel.MapModel;
import me.magicall.db.util.PageInfo;
import me.magicall.db.util.ReturnKeyAndAffect;

/**
 * 这是一个service
 * 
 * @author MaGiCalL
 */
public interface MapModelAccessor {

	boolean containsModelName(String modelName);

	Collection<MapModel<?>> all(String modelName);

	Map<Comparable<?>, MapModel<?>> allMap(String modelName);

	/**
	 * 暂无使用
	 * 
	 * @param modelName
	 * @param ids
	 * @return
	 */
	Collection<MapModel<?>> all(String modelName, Object... ids);

	Collection<MapModel<?>> all(String modelName, Collection<? extends Object> ids);

	Map<Comparable<?>, MapModel<?>> allMap(String modelName, Collection<? extends Object> ids);

	List<MapModel<?>> all(final String modelName, final Map<String, ?> parameterMap);

	Map<Comparable<?>, MapModel<?>> allMap(final String modelName, final Map<String, ?> parameterMap);

	/**
	 * @param modelName
	 * @param id
	 * @param withReferenced 是否获取被关联对象（以本对象id为外键的其他对象）。那些其他对象是一个集合（Collection），以其modelName+s作为名字
	 * @param withReferencing 是否获取关联的对象（本对象某些字段作为外键获取其他对象）。那些关联的他表对象是一个集合（Collection），以其modelName+s作为名字
	 * @return
	 */
	MapModel<?> getOne(final String modelName, final Object id, final boolean withReferenced, final boolean withReferencing);

	MapModel<?> getOne(final String modelName, final Object id);

	MapModel<?> getOne(final String modelName, final Map<String, ?> parameterMap);

	Collection<MapModel<?>> list(final String modelName, final Collection<? extends Object> ids);

	/**
	 * 暂无使用
	 * 
	 * @param modelName
	 * @param ids
	 * @return
	 */
	Map<Comparable<?>, MapModel<?>> map(String modelName, Collection<? extends Object> ids);

	List<MapModel<?>> list(String modelName, Map<String, ?> parameterMap, PageInfo pageInfo);

	/**
	 * 暂无使用
	 * 
	 * @param modelName
	 * @param parameterMap
	 * @param pageInfo
	 * @return
	 */
	Map<Comparable<?>, MapModel<?>> map(String modelName, Map<String, ?> parameterMap, PageInfo pageInfo);

	List<MapModel<?>> list(final String modelName, final Map<String, ?> parameterMap, final int size);

	/**
	 * 暂无使用
	 * 
	 * @param modelName
	 * @param parameterMap
	 * @param size
	 * @return
	 */
	Map<Comparable<?>, MapModel<?>> map(String modelName, Map<String, ?> parameterMap, final int size);

	/**
	 * 支持外键跨表查询。
	 * 
	 * @param modelName
	 * @param parameterMap
	 * @param pageInfo
	 * @return
	 */
	ResultView<MapModel<?>> listWithPageInfo(final String modelName, final Map<String, ?> parameterMap, final PageInfo pageInfo);

	/**
	 * 暂无使用
	 * 
	 * @param modelName
	 * @param parameterMap
	 * @param size
	 * @return
	 */
	ResultView<MapModel<?>> listWithPageInfo(final String modelName, final Map<String, ?> parameterMap, final int size);

	/**
	 * 支持多值。如果map中某一字段的值是集合或数组，则将拆分为相应个数个model插入数据库。
	 * 
	 * @param modelName
	 * @param parameterMap
	 * @return
	 */
	boolean addOrUpdate(final String modelName, final Map<String, Object> parameterMap);

	ReturnKeyAndAffect addReturnKey(String modelName, Map<String, Object> parameterMap);

	int count(String modelName, Map<String, ?> parameterMap);

	boolean addOrUpdate(String modelName, Collection<MapModel<?>> models);

	boolean del(String modelName, Comparable<?> id);
}